﻿Public Class frmAcualizarOrdenesServicioTecnico

    Private Sub frmAcualizarOrdenesServicioTecnico_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        LimpiaArticulo()
        LimpiaFormulario()
        LimpiarLista()
        CargaEstadosOC()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Salir()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        ConsultarOrdenServicio.ShowDialog()
    End Sub

    Private Sub btnConsultar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConsultar.Click
        Dim businessOS As New businessOS()
        Dim OS As New clsOrden_Servicio()
        Dim ListaOS As New List(Of clsOrden_Servicio)
        Dim NroOS As Int32
        Dim FecDesde As Date
        Dim FecHasta As Date
        Try
            If txtNroOS.Text.Trim.Length > 0 Then
                NroOS = Convert.ToInt32(txtNroOS.Text.Trim)
            Else
                NroOS = 0
            End If
            If ValidaFecha() = False Then
                Exit Sub
            End If


            FecDesde = dtpFecDesde.Value
            FecHasta = dtpFecHasta.Value

            ListaOS = businessOS.TraeOrdenesServicioTecnicos(NroOS, FecDesde, FecHasta)

            If ListaOS.Count = 0 Then
                MessageBox.Show("No se encontraron ordenes de servicio con los parametros especificados", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            ElseIf ListaOS.Count = 1 Then
                OS = ListaOS.Item(0)
                AsignaCampo(OS)
            Else
                TraeConsulta(ListaOS)
            End If
        Catch ex As Exception
        Finally
            businessOS.Dispose()
            OS.Dispose()
        End Try

    End Sub

    Private Sub btnLimpiaForm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiaForm.Click
        LimpiaFormulario()
    End Sub
    Private Sub LimpiaFormulario()
        txtNroOS.Text = ""
        dtpFecDesde.Value = Now.Date
        dtpFecDesde.MaxDate = Now.Date
        txtDetalle.Text = ""
        dtpFecHasta.Value = Now.Date
        dtpFecHasta.MaxDate = Now.Date
        txtObservacion.Text = ""

        txtNroOS.Enabled = True
        dtpFecDesde.Enabled = True
        dtpFecHasta.Enabled = True
        txtDetalle.Enabled = False

    End Sub
    Public Sub AsignaCampo(ByVal OS As clsOrden_Servicio)
        txtNroOS.Text = OS.Os_Id.ToString.Trim
        txtDetalle.Text = OS.Detalle.Item(0).Descri

        txtNroOS.Enabled = False
        dtpFecDesde.Enabled = False
        dtpFecHasta.Enabled = False
        txtDetalle.Enabled = False

    End Sub
    Private Sub TraeConsulta(ByVal ListaOS As List(Of clsOrden_Servicio))
        Me.Enabled = False
        ConsultarOrdenServicio.ModoAcceso = "MODI OS TECNICO"
        ConsultarOrdenServicio.FormatoGrilla()
        ConsultarOrdenServicio.CargaGrilla(ListaOS)
        ConsultarOrdenServicio.MdiParent = Me.MdiParent
        ConsultarOrdenServicio.Show()
    End Sub


    Private Sub btnBuscarArticulo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarArticulo.Click
        Dim Producto As New clsCatalogo()
        Dim ProductoDao As New daoCatalogo()
        Dim ListaProductos As New List(Of clsCatalogo)

        ''Veo si agrego un codigo numerico o si es carater
        If txtCodArticulo.Text.Trim.Length > 0 Then 'Si ingreso un codigo de articulo busco por ese codigo
            Dim Codigo As Int32
            Dim Nombre As String
            If IsNumeric(txtCodArticulo.Text.Trim) Then
                Codigo = Convert.ToInt32(txtCodArticulo.Text.Trim)
                If Codigo > 0 Then
                    Producto = ProductoDao.TraeArticulo(Codigo)
                End If
            End If

            If Producto.Prod_Id > 0 Then
                AsignaCampos(Producto)
            Else
                Nombre = txtCodArticulo.Text.Trim.ToUpper
                ListaProductos = ProductoDao.TraeArticulos(Nombre)
                If ListaProductos.Count > 1 Then ''Encontro mas de un articulo
                    TraeConsulta(ListaProductos)
                ElseIf ListaProductos.Count = 1 Then '' Encontro un solo articulo
                    Producto = ListaProductos.Item(0)
                    AsignaCampos(Producto)
                Else ''No encontro ningun articulo
                    MessageBox.Show("No se encontró ningun producto ", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If
        Else ''SI no ingreso nada traigo todos los articulos
            ListaProductos = ProductoDao.TraeArticulos()
            If ListaProductos.Count > 1 Then ''Encontro mas de un articulo
                TraeConsulta(ListaProductos)
            ElseIf ListaProductos.Count = 1 Then '' Encontro un solo articulo
                Producto = ListaProductos.Item(0)
                AsignaCampos(Producto)
            Else ''No encontro ningun articulo
                MessageBox.Show("No se encontró ningun producto ", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End If
        Producto.Dispose()
        ProductoDao.Dispose()
    End Sub

    Private Sub btnAgregarACarrito_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregarACarrito.Click
        Dim Producto As New clsCatalogo()
        Dim ProductoBusiness As New businessCatalogo()
        Dim ProductoDao As New daoCatalogo()
        Dim Cantidad As Int32
        Dim NroSerie As String

        Try
            Producto = ProductoDao.TraeArticulo(Convert.ToInt32(txtCodArticulo.Text.Trim))
            Cantidad = 1
            NroSerie = txtNroSerie.Text.Trim.ToUpper

            ''Valido que el articulo tenga stock disponible 
            If ProductoBusiness.ValidaStock(Producto, Cantidad) Then
                ''Verifico si la lista ya tiene articulos
                Dim ItemsEnLista As Int32
                Dim Total As Decimal
                Dim i As Int32
                Total = Convert.ToDecimal(txtTotal.Text.Trim)
                ItemsEnLista = lvArticulos.Items.Count()

                If ItemsEnLista > 0 Then
                    'Recorro la lista existente
                    For i = 0 To ItemsEnLista - 1
                        ''Si encuentro el producto actualizo la cantidad y el importe
                    Next
                End If

                ''Agrego el nuevo registro
                lvArticulos.Items.Add(Producto.Prod_Id.ToString.Trim)
                lvArticulos.Items(i).SubItems.Add(Producto.Descripcion.Trim.ToUpper)
                lvArticulos.Items(i).SubItems.Add(NroSerie)
                lvArticulos.Items(i).SubItems.Add(Cantidad.ToString.Trim)
                lvArticulos.Items(i).SubItems.Add("$" & Convert.ToString(Producto.Costo * Configuracion.Ganancia))
                ''Actualizo el Total de la compra
                Total = Total + Producto.Costo * Configuracion.Ganancia * Cantidad
                txtTotal.Text = Total.ToString.Trim
            Else
            MessageBox.Show("No hay suficiente stock del artículo seleccionado", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
            txtCodArticulo.Text = ""
            LimpiaArticulo()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            Producto.Dispose()
            ProductoBusiness.Dispose()
            ProductoDao.Dispose()
        End Try
    End Sub

    Private Sub btnQuitarDeCarrito_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuitarDeCarrito.Click
        If lvArticulos.Items.Count = 0 Then
            MessageBox.Show("No hay registros cargados.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Exit Sub
        End If
        If lvArticulos.SelectedItems.Count = 1 Then
            Dim Total As Decimal
            Dim Producto As New clsCatalogo()
            Dim ProductoDao As New daoCatalogo()
            Total = Convert.ToDecimal(txtTotal.Text.Trim)

            Producto = ProductoDao.TraeArticulo(Convert.ToInt32(lvArticulos.SelectedItems(0).Text.Trim))

            Total = Total - (Producto.Costo * Convert.ToInt32(lvArticulos.SelectedItems(0).SubItems(3).Text.Trim) * Configuracion.Ganancia)

            txtTotal.Text = Total.ToString.Trim
            lvArticulos.Items.Remove(lvArticulos.SelectedItems(0))
        Else
            MessageBox.Show("Seleccione un Artículo para eliminar", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub
    Public Sub LimpiaArticulo()
        'txtCodArticulo.Text = ""
        txtNroSerie.Text = ""
        txtNroSerie.Enabled = False
        lblDescAticulo.Text = ""
        lblDescAticulo.Visible = False
        btnAgregarACarrito.Enabled = False
    End Sub

    Private Sub txtCodArticulo_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCodArticulo.KeyPress
        validarInt(e)
    End Sub

    Private Sub txtCodArticulo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtCodArticulo.TextChanged
        LimpiaArticulo()
    End Sub
    Private Sub AsignaCampos(ByVal Producto As clsCatalogo)
        txtCodArticulo.Text = Convert.ToString(Producto.Prod_Id).Trim
        txtNroSerie.Text = ""
        txtNroSerie.Enabled = True
        lblDescAticulo.Text = Producto.Descripcion.Trim.ToUpper
        lblDescAticulo.Visible = True
        btnAgregarACarrito.Enabled = True
    End Sub
    Private Sub TraeConsulta(ByVal ListaProductos As List(Of clsCatalogo))
        consultaCatalogo.ModoAcceso = "MODI OS TECNICO"
        consultaCatalogo.grdCatalogo.DataSource = ListaProductos

        consultaCatalogo.grdCatalogo.Columns(0).DataPropertyName = "Prod_Id"
        consultaCatalogo.grdCatalogo.Columns(1).DataPropertyName = "Descripcion"
        consultaCatalogo.grdCatalogo.Columns(2).DataPropertyName = "Marca"
        consultaCatalogo.grdCatalogo.Columns(3).DataPropertyName = "Modelo"
        consultaCatalogo.grdCatalogo.Columns(4).DataPropertyName = "Tipo"
        consultaCatalogo.grdCatalogo.Columns(5).DataPropertyName = "Costo"
        consultaCatalogo.grdCatalogo.Columns(6).DataPropertyName = "Cantidad"
        consultaCatalogo.grdCatalogo.Columns(7).DataPropertyName = "Proveedor"
        consultaCatalogo.grdCatalogo.Columns(8).DataPropertyName = "Fecha_Ingreso"
        consultaCatalogo.grdCatalogo.Columns(9).DataPropertyName = "Cod_Suc"

        consultaCatalogo.grdCatalogo.Columns(0).HeaderText = "Codigo"
        consultaCatalogo.grdCatalogo.Columns(1).HeaderText = "Descripcion"
        consultaCatalogo.grdCatalogo.Columns(2).HeaderText = "Marca"
        consultaCatalogo.grdCatalogo.Columns(3).HeaderText = "Modelo"
        consultaCatalogo.grdCatalogo.Columns(4).HeaderText = "Tipo"
        consultaCatalogo.grdCatalogo.Columns(5).HeaderText = "Costo"
        consultaCatalogo.grdCatalogo.Columns(6).HeaderText = "Stock"
        consultaCatalogo.grdCatalogo.Columns(7).HeaderText = "Proveedor"
        consultaCatalogo.grdCatalogo.Columns(8).HeaderText = "Fecha Alta"
        consultaCatalogo.grdCatalogo.Columns(9).HeaderText = "Sucursal"

        consultaCatalogo.grdCatalogo.Columns(9).Visible = False

        consultaCatalogo.MdiParent = Me.MdiParent
        Me.Enabled = False
        consultaCatalogo.Show()
    End Sub
    Private Sub CargaEstadosOC()
        Dim ListaEstadosOc As New List(Of clsEstado_Os)
        Dim EstadoOCDao As New daoEstado_Os()
        ListaEstadosOc = EstadoOCDao.TraeEstadosOrdenServicioTecnico()
        EstadoOCDao.Dispose()
        cmbEstadoOC.DataSource = ListaEstadosOc
        cmbEstadoOC.ValueMember = "EstadoOs_Id"
        cmbEstadoOC.DisplayMember = "EstadoOs_Desc"
        cmbEstadoOC.SelectedIndex = 0
    End Sub

    Private Sub cmbEstadoOC_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbEstadoOC.SelectedValueChanged
        Dim EstadoOS As New clsEstado_Os()
        Dim EstadoOsDao As New daoEstado_Os()
        If cmbEstadoOC.ValueMember.Trim.Length > 0 Then
            EstadoOS = EstadoOsDao.TraeEstadoOrdenServicio(Convert.ToInt32(cmbEstadoOC.SelectedValue))
            EstadoOsDao.Dispose()

            If EstadoOS.EstadoOs_Id = 3 Then
                GruopConsumos.Enabled = True
            Else
                GruopConsumos.Enabled = False
            End If
        End If
    End Sub
    Private Sub LimpiarLista()
        lvArticulos.Items.Clear()
        lvArticulos.Columns.Clear()
        lvArticulos.Columns.Add("Cod. Articulo", 100) '0
        lvArticulos.Columns.Add("Nombre", 200) '1
        lvArticulos.Columns.Add("Nro. Serie", 80) '2
        lvArticulos.Columns.Add("Cantidad", 50) '3
        lvArticulos.Columns.Add("Importe", 100) '4
        txtTotal.Text = "0"
        txtTotal.Enabled = False
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim OS As New clsOrden_Servicio()
        Dim OSDet As New clsOrden_Servicio_Detalle
        Dim EstadoOS As New clsEstado_Os()
        Dim BusinessOS As New businessOS()
        Dim OSDao As New daoOrden_Servicio()
        Dim EstadoOsDao As New daoEstado_Os()
        Dim OSDetDao As New daoOrden_Servicio_Detalle()
        Dim OsConsumDao As New daoOrden_Servicio_Consumos()
        Dim ProductoDao As New daoCatalogo()
        Dim ProductoBusiness As New businessCatalogo()

        Try
            ''Valido que sea una OS Valida
            If txtNroOS.Text.Trim.Length = 0 Then
                MessageBox.Show("Debe seleccionar una Orden de Servicio Validad para actualizar", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Exit Sub
            End If

            OS = OSDao.TraeOrdenServicio(Convert.ToInt32(txtNroOS.Text.Trim))
            If OS.Os_Id = 0 Then
                MessageBox.Show("Debe seleccionar una Orden de Servicio Validad para actualizar", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Exit Sub
            End If

            ''VAlido que el cambio de estado sea valido
            EstadoOS = EstadoOsDao.TraeEstadoOrdenServicio(Convert.ToInt32(cmbEstadoOC.SelectedValue))
            If BusinessOS.ValidaCambioEstado(OS, EstadoOS) = False Then
                MessageBox.Show("El cambio de estado que intenta hacer no es valido.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Exit Sub
            End If



            ''Actualizo el estado de la OS
            OS.Os_Estado = EstadoOS.EstadoOs_Id
            If OSDao.Modificar(OS) Then
                '' si se actualizo a estado repaarad actualizo el stock de lo consumido
                If OS.Os_Estado = 5 Then
                    If BusinessOS.ActualizoStockConsumido(OS) Then
                        MessageBox.Show("Ocurrio un error al actualizar el stock de lo consumido.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End If
                End If

                ''Doy de alta el detalle
                Dim Observacion As String
                Observacion = txtObservacion.Text.Trim.ToUpper
                OSDet.Os_Id = OS.Os_Id
                OSDet.Osdte_Estado = EstadoOS.EstadoOs_Id
                OSDet.Descri = Observacion
                OSDet.Cod_Suc = Configuracion.Cod_Suc
                OSDet.Osdte_Id = Numerador.TraeProximo("ORDEN_SERVICIO_DETALLE")

                If OSDetDao.Alta(OSDet) Then
                    ''Actualizo el total de la Orden de servicio.
                    If Convert.ToDecimal(txtTotal.Text.Trim) > 0 Then
                        OS.Os_Importe = Convert.ToDecimal(txtTotal.Text.Trim)
                        If OSDao.Modificar(OS) Then
                            ConfirmaGuardadoExitoso()
                        Else
                            MessageBox.Show("No se pudo actualizar el importe de la OS. Comuniquese con Sistemas", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                            Exit Sub
                        End If
                    End If

                    ''Si el estado es 3 veo si se cargaron consumos y los doy de alta
                    If EstadoOS.EstadoOs_Id = 3 Then
                        Dim CantItems As Int32
                        CantItems = lvArticulos.Items.Count
                        If CantItems > 0 Then
                            For i = 0 To CantItems - 1
                                Dim OsConsum As New clsOrden_Servicio_Consumos()
                                Dim Producto As New clsCatalogo()
                                Producto = ProductoDao.TraeArticulo(Convert.ToInt32(lvArticulos.Items(i).Text.Trim))
                                OsConsum.Osdet_Id = OSDet.Os_Id
                                OsConsum.Prod_Id = Convert.ToInt32(Producto.Prod_Id)
                                OsConsum.Nro_Serie = lvArticulos.Items(i).SubItems(2).Text.Trim.ToUpper
                                OsConsum.Cod_Suc = Configuracion.Cod_Suc
                                OsConsum.Oscons_Id = Numerador.TraeProximo("ORDEN_SERVICIO_CONSUMOS")

                                ''Alata del Consumo
                                If OsConsumDao.Alta(OsConsum) = False Then
                                    MessageBox.Show("No se pudo generar el detalle de consumos de la Actualizacion. Comuniquese con Sistemas", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                                    Exit Sub
                                End If
                                OsConsum.Dispose()
                                Producto.Dispose()
                            Next
                        Else
                            ConfirmaGuardadoExitoso()
                        End If
                    Else
                        ConfirmaGuardadoExitoso()
                    End If
                Else
                    MessageBox.Show("No se pudo generar el detalle de la actualisacion de OS. Comuniquese con Sistemas", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Exit Sub
                End If
            Else
                MessageBox.Show("No se pudo actualizar la orden de servicio. Comuniquese con Sistemas", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Exit Sub
            End If
        Catch ex As Exception
        Finally
            OS.Dispose()
            OSDet.Dispose()
            EstadoOS.Dispose()
            BusinessOS.Dispose()
            OSDao.Dispose()
            EstadoOsDao.Dispose()
            OSDetDao.Dispose()
            ProductoBusiness.Dispose()
            ProductoDao.Dispose()
        End Try
    End Sub
    Private Sub Salir()
        If (txtNroOS.Text.Trim.Length > 0 Or txtObservacion.Text.Trim.Length > 0 Or lvArticulos.Items.Count > 0) Then
            Dim Respuesta As DialogResult
            Respuesta = MessageBox.Show("¿Desea salir sin guardar?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
            If Respuesta = Windows.Forms.DialogResult.Yes Then
                Me.Close()
            End If
        Else
            Me.Close()
        End If
    End Sub
    Private Sub ConfirmaGuardadoExitoso()
        MessageBox.Show("La actualización de la Orden se realizo correctamente.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
        LimpiaArticulo()
        LimpiarLista()
        LimpiaFormulario()
    End Sub
    Private Function ValidaFecha() As Boolean
        If dtpFecDesde.Value > dtpFecHasta.Value Then
            MessageBox.Show("La fecha desde no puede ser mayor a la fecha Hasta", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return False
        Else
            Return True
        End If
    End Function

    Private Sub txtNroOS_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtNroOS.KeyPress
        validarInt(e)
    End Sub

End Class